// 引入数据库模块
const db = require('../mysql/index')
// 密码加密模块
const bcrypt = require('bcryptjs')
// 引入uuid
const { v4 } = require('uuid')
const { getNowTime, formatTimestamp } = require('../common/common')
const checkParam = require('../utils/checkParam')
const checkObject = require('../utils/checkObject')
const redis = require('../utils/redis')
const mysql2 = require('../mysql/mysqlTools')
const log4js = require('../utils/log4')
const logger = log4js.getLogger(`server/router_handler/admin.js`)
const jwt = require('jsonwebtoken')
const { QueryDb,savePhotoFile } = require('../utils/index')
const { tokenSecretKey } = require('../config/index')

// 注册
exports.register = async(req, res) => {
  const userInfo = req.body
  const checks = checkParam(userInfo, ['nickname', 'username', 'is_able', 'roleId', 'mobile'])
  if (checks) {
    return res.send({
      status: 0,
      message: `缺少参数: ${checks}`
    })
  }
  if(!req.files){
    return res.send({
      status:0,
      message:`请上传头像`
    })
  }
  const imgName = await savePhotoFile(req.files.file)
  userInfo.user_pic =  imgName
  const regex = /^[1-9]\d{10}$/
  if (!regex.test(userInfo.mobile)) return res.cc('手机号格式不正确')

  // 用户名是否被占用
  const userName = 'SELECT * FROM admin WHERE username = ?'
  db.query(userName, userInfo.username, (err, result) => {
    // sql执行失败
    if (err) return res.cc(err)
    // 用户名存在
    if (result.length > 0) return res.cc('用户名已存在')
    const mobileSql = 'SELECT * FROM admin WHERE mobile = ?'
    db.query(mobileSql, userInfo.mobile, (err, result) => {
      if (err) return res.cc(err)
      if (result.length > 0) return res.cc('手机号已存在')
      // 用户名不存在（可以注册）
      // 对密码进行加密 bcrypt.hashSync(要加密的密码, 长度)
      userInfo.password = bcrypt.hashSync(userInfo.password, 10)
      // 添加用户
      const sqlAddUser = 'INSERT INTO admin set ?'
      const insertObject = checkObject({
        nickname: userInfo.nickname,
        username: userInfo.username,
        password: userInfo.password,
        mobile: userInfo.mobile,
        user_pic: userInfo.user_pic || undefined,
        is_able: userInfo.is_able || 1
      })
      db.query(sqlAddUser, insertObject, async (err, result) => {
        if (err) return res.cc(err)
        if (result.insertId) {
          db.query(`INSERT INTO admin_roles(admin_id, role_id) VALUES(${result.insertId},${userInfo.roleId})`, (err, data) => {
            if (err) return res.cc(err)
            if (data.affectedRows === 1) {
              return res.send({
                status:1,
                message:'添加成功'
              })
            }
            return res.cc('添加失败')
          })
        }
      })
    })
  })
}

// 登录
exports.login = async (req, res) => {
  const userInfo = req.body
  if (!userInfo.username || !userInfo.password) return res.cc('用户名或密码不合法')
  // 查询是否用户存在
  const sqlUser = `SELECT * FROM admin WHERE username = ? AND is_del = 0 AND is_able = 1`

  let timeoutOccurred = false // 超时标志
  let responseSent = false // 响应已发送标志

  try {
    const user = await mysql2.reader(sqlUser, [userInfo.username])
    if (user.length == 0) return res.send({ code: 401, message: '用户不存在或者被禁用' })
    const compareResult = bcrypt.compareSync(userInfo.password, user[0].password)
    console.log(compareResult)
    if (!compareResult) return res.cc('输入的密码有误')
    // const sessionId = v4()
    const token = 'Bearer ' + jwt.sign({id:user[0].id},tokenSecretKey,{expiresIn: '4h'})

    //改为token登录


    // try {
      // 使用Promise.race设置超时限制
    //   await Promise.race([
    //     new Promise((resolve, reject) => {
    //       redis
    //         .pipeline()
    //         .set(`session:sessionId:${sessionId}`, user[0].id, 'EX', 7200)
    //         .set(`session:adminId:${user[0].id}`, sessionId, 'EX', 7200)
    //         .exec((err, result) => {
    //           if (timeoutOccurred || responseSent) return // 超时或响应已发送时不再执行后续代码
    //           if (err) {
    //             reject(err)
    //           } else {
    //             resolve(result)
    //           }
    //         })
    //     }),
    //     new Promise((resolve, reject) => {
    //       setTimeout(() => {
    //         timeoutOccurred = true // 设置超时标志
    //         reject(new Error('Redis连接超时'))
    //         if (!responseSent) {
    //           res.status(500).json({ status: 0, message: 'Redis连接超时' }) // 这里立即返回响应并终止函数执行
    //           responseSent = true // 设置响应已发送标志
    //         }
    //         return // 确保在这里结束函数执行
    //       }, 5000)
    //     })
    //   ])
    // } catch (redisError) {
    //   logger.error('Redis连接超时:', redisError)
    //   // 不再在这里发送响应
    // }

    // if (timeoutOccurred || responseSent) return // 超时或响应已发送时不再执行后续代码

    // 确保在 try-catch 中发送响应
    res.send({
      status: 1,
      message: '登录成功',
      data:token,
      id: user[0].id
    })

    responseSent = true // 设置响应已发送标志
  } catch (error) {
    logger.error(error)
    // 在 catch 中发送响应
    // if (!responseSent) {
    //   res.status(500).json({ status: 0, message: error.message })
    //   responseSent = true // 设置响应已发送标志
    // }
  }
}
